package com.ch.engine.utils.aes3;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

public class PasswordUtils {
    /**
     * 1、 加盐并生成密码
     *
     * @param password 明文密码
     * @return 保存到数据库中的密码
     */
    public static String encrypt(String password) {
        // 产生盐值(32位)
        String salt = UUID.randomUUID().toString().replace("-", "");
        // 生成加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 生成最终的密码 (保存到数据库中的密码)【约定格式： 32位盐值 + $ + 32位加盐后密码】
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 2、生成加盐的密码（方法一的重载）
     *
     * @param password 明文
     * @param salt     盐值
     * @return 数据库中的最终密码
     */
    public static String encrypt(String password, String salt) {
        // 生成加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 生成最终的密码
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 3、验证密码
     *
     * @param inputPassword 用户输入的明文密码
     * @param finalPassword 数据库中存储的最终密码
     * @return
     */
    public static boolean check(String inputPassword, String finalPassword) {
        if (!StringUtils.hasLength(inputPassword) || !StringUtils.hasLength(finalPassword)
                || finalPassword.length() != 65) {
            return false;
        }
        // 1、得到盐值
        String salt = finalPassword.split("\\$")[0];
        // 2、使用加密方式对明文和盐值进行加密
        String confirmPassword = encrypt(inputPassword, salt);
        // 进行对比
        return confirmPassword.equals(finalPassword);

    }

    public static void main(String[] args) {
        String password = "123456";
        String finalPassword = PasswordUtils.encrypt(password);
        System.out.println("加密：" + PasswordUtils.encrypt(password));
        String inputPassword = "12345";
        System.out.println("对比：" + inputPassword + "是否等于" + password + "结果" +
                PasswordUtils.check(inputPassword, finalPassword));
        String inputPassword2 = "123456";
        System.out.println("对比：" + inputPassword2 + "是否等于" + password + "结果" +
                PasswordUtils.check(inputPassword2, finalPassword));
    }
}